package com.bryant.demo05.ui.video

import android.view.LayoutInflater
import androidx.core.net.toUri
import androidx.media3.common.MediaItem
import androidx.media3.exoplayer.ExoPlayer
import com.bryant.demo05.base.BaseBindingActivity
import com.bryant.demo05.databinding.AcMedia3PlayerBinding


class Media3PlayerActivity : BaseBindingActivity<AcMedia3PlayerBinding> (){
    // 获取播放器 - 类型为ExoPlayer - 需导入
    private var player: ExoPlayer?= null
    private var playWhenReady = true
    private var currentWindow = 0
    private var playbackPosition = 0L
    // 1. 生命周期 - activity开始时 - 初始化播放器
    override fun onStart () {
        super.onStart()
        // 初始化播放器
        initPlayer()
    }
    // 2.生命周期 - activity停止时， 释放播放器资源
    override fun onStop () {
        super.onStop()
        // 释放播放器资源
        releasePlayer()
    }
    override fun initBinding(layoutInflater: LayoutInflater): AcMedia3PlayerBinding {
      return AcMedia3PlayerBinding.inflate(layoutInflater)
    }

    // 1. 初始化播放器
   private fun initPlayer() {
    // 创建一个 ExoPlayer 实例，并将其赋值给 player 变量
    player = ExoPlayer.Builder(this).build().also { exoPlayer ->
        // 将 playerView 与 ExoPlayer 实例绑定，使界面能够显示和控制播放器
        binding.playerView.player = exoPlayer

        // 构造本地资源 URI，用于加载 raw 文件夹下的 weather_demo 视频文件
        val rawuri = "android.resource://${packageName}/raw/weather_demo".toUri()

        // 使用构造好的 URI 创建一个 MediaItem 对象，代表要播放的媒体内容
        val mediaItem = MediaItem.fromUri(rawuri)

        // 将 MediaItem 设置到播放器中
        exoPlayer.setMediaItem(mediaItem)

        // 设置播放器是否在准备好后自动播放
        exoPlayer.playWhenReady = playWhenReady

        // 设置播放器从上次停止的位置继续播放（窗口索引和位置）
        exoPlayer.seekTo(currentWindow, playbackPosition)

        // 让播放器准备播放资源（开始加载并解析媒体内容）
        exoPlayer.prepare()
    }
}

    // 2. 释放播放器资源
   private fun releasePlayer() {
    // 使用安全调用操作符检查 player 是否为 null，如果不为 null 则执行大括号内的代码块
    player?.let { exoPlayer ->
        // 保存当前播放位置，以便下次可以从中断处继续播放
        playbackPosition = exoPlayer.currentPosition

        // 保存当前媒体项的索引（窗口），用于支持播放列表场景
        currentWindow = exoPlayer.currentMediaItemIndex

        // 保存播放器的播放状态（是否准备就绪时自动播放）
        playWhenReady = exoPlayer.playWhenReady

        // 释放播放器占用的系统资源
        exoPlayer.release()
    }

    // 将 player 引用置为 null，避免内存泄漏
    player = null
}

}